#include <stdio.h>

#include <unistd.h>

#include "MyFile.h"



#define filename "file.txt"

// int main()
// {
//     //   printf("hello world\n");
//     //

//     // _FILE* fp = _fopen(filename, "w");

//     // if (fp == NULL) return -1;

//     // const char* massage = "Hello world\nhello\nhello\n";

//     // _fwrite(massage,strlen(massage),1,fp);

//     // // _fflush(fp);

//     // _fclose(fp);

//     //---------------------------

//     // _FILE* fp = _fopen(filename, "a");

//     // if (fp == NULL) return -1;

//     // const char* massage = "Hello world\n";

//     // _fwrite(massage, strlen(massage), 1, fp);

//     // // _fflush(fp);

//     // _fclose(fp);

//     //---------------------------

//     _FILE* fp = _fopen(filename, "r");

//     // if (fp == NULL) return -1;
//     // //判断打开文件流是否成功

//     // char buf[1024];
//     // int pos = _fread(buf,1024,1,fp);
//     // if(pos == EOF){
//     //     perror("_fread\n");
//     //     return -1;
//     // }
//     // // _fflush(fp);
//     // buf[pos] = '\0';
//     // printf("%s\n", buf);
//     // _fclose(fp);

//     return 0;
// }


//---------------------------------

//确保在本次测试当中 测试文件处于空
int main()
{
    //在本次测试当中主要测试全缓冲
    //故在MyFile.c : 21 中需要将文件的刷新策略修改为全缓冲
    
    /*
        实际上对于缓冲区的刷新(这里以全缓冲为例)
        在调用printf进行打印时 运行程序后并使用重定向>将打印的信息重定向至一个文件当中
        此时缓冲策略将从行缓冲策略更新为全缓冲

        这里涉及到一个问题
        在上文当中提到了 当进程结束时 即main函数进行return后
        编译器将隐式调用一个exit函数
        在这个exit函数将会进行一个刷新缓冲区的动作并关闭对应的文件流
        这里的刷新缓冲区和关闭文件流刷新的是当前打开的所有的文件流
        对应的关闭文件流也是关闭所有打开的文件流

        而对应的实际上在进行fclose关闭一个文件流时对应的也会刷新其缓冲区
        对应的fclose所关闭的文件流只是刷新当前需要关闭的文件流使得数据能够被完整刷新

    */
      _FILE* fp = _fopen(filename, "a");

      if (fp == NULL) return -1;
      int cnt = 5;
      const char* massage = "Hello world\n";
        while(cnt--){
          _fwrite(massage, strlen(massage), 1, fp);
          sleep(1);
        }
        /*
          在此次测试当中
          将会以全缓冲的刷新策略 每隔一秒将写入一句massage至文件当中
          但是由于文件写入的策略是全缓冲的方式
          即当缓冲区写满或者是进程结束,关闭文件流的方式将会进行一次刷新缓冲区
          故在前几秒当中并不会将数据写入文件当中
          只有当关闭文件流时才会对缓冲区进行一次刷新

          利用shell脚本进行观测

          while :; 
          do cat file.txt ; 
          sleep 1 ; 
          echo "-----------";
          done 

          -----------------
          -----------------
          -----------------
          -----------------
          Hello world
          Hello world
          Hello world
          Hello world
          Hello world
          -----------------
        */
        _fclose(fp);
        return 0;
}